RegExp-এ Lookaheads এবং Lookbehinds এমন মেটাচারিত্র যা আপনাকে প্যাটার্নের আগে বা প্যাটার্নের পরে কিছু শর্ত বা চরিত্র মিলানোর সুযোগ দেয়, তবে এগুলি স্ট্রিংয়ে কোনো অক্ষর যোগ বা বাদ দেয় না। এই ধরনের প্যাটার্ন assertions হিসেবে পরিচিত, কারণ তারা নির্দিষ্ট শর্ত পূরণ হলে মিল পাওয়া নিশ্চিত করে।
Lookahead: ভবিষ্যতের সাথে মিল
Lookahead প্যাটার্নটি RegExp-এ অধিক শর্তে মিল করার জন্য ব্যবহৃত হয়, যা বর্তমান অবস্থার পরে কি ঘটবে তা চেক করে। এটি স্ট্রিংয়ের আগামী অংশ দেখতে সাহায্য করে এবং সেই অনুযায়ী মিল নিশ্চিত করে।
Positive Lookahead ((?=...))
Positive Lookahead প্যাটার্নটি একটি শর্ত চেক করে, তবে তা স্ট্রিংয়ে কোনো কিছু মিলায় না, শুধু নিশ্চিত করে যে পরবর্তী অংশটি সঠিক। এটি স্ট্রিংয়ের বর্তমান অবস্থান থেকে পরে কিছু নির্দিষ্ট শর্ত মিলবে কিনা তা পরীক্ষা করে।
সিনট্যাক্স:
let regex = /a(?=b)/;
এখানে, (?=b) চেক করবে যে "a" এর পর "b" আছে কিনা।
উদাহরণ:
let regex = /a(?=b)/;
let str = "abc";
console.log(regex.test(str)); // true
এখানে, a এর পরে "b" থাকার কারণে প্যাটার্নটি true রিটার্ন করবে। তবে, b স্ট্রিংয়ে মেলা হবে না, কারণ এটি শুধুমাত্র ভবিষ্যতের শর্ত হিসেবে কাজ করছে।
Negative Lookahead ((?!...))
Negative Lookahead প্যাটার্নটি ঠিক তার বিপরীত কাজ করে। এটি চেক করবে যে পরবর্তী অংশে কিছু নির্দিষ্ট শর্ত নেই কিনা।
সিনট্যাক্স:
let regex = /a(?!b)/;
এখানে, (?!b) প্যাটার্নটি চেক করবে যে "a" এর পরে "b" নেই।
উদাহরণ:
let regex = /a(?!b)/;
let str = "ac";
console.log(regex.test(str)); // true
এখানে, a এর পরে "b" না থাকায়, প্যাটার্নটি true রিটার্ন করবে। তবে, যদি স্ট্রিংয়ের পরবর্তী অংশে "b" থাকে, তাহলে এটি মেলবে না।
Lookbehind: অতীতের সাথে মিল
Lookbehind প্যাটার্নটি RegExp-এ স্ট্রিংয়ের পূর্ববর্তী অংশ দেখতে সাহায্য করে এবং এটি চেক করে যে আগের অংশটি কি ছিল। এটি স্ট্রিংয়ের কোনো পূর্ববর্তী অবস্থার সাথে মিলানোর জন্য ব্যবহৃত হয়।
Positive Lookbehind ((?<=...))
Positive Lookbehind প্যাটার্নটি চেক করবে যে স্ট্রিংয়ের বর্তমান অবস্থার আগে কিছু নির্দিষ্ট শর্ত পূর্ণ হচ্ছে কিনা।
সিনট্যাক্স:
let regex = /(?<=a)b/;
এখানে, (?<=a) চেক করবে যে "b" এর আগে "a" রয়েছে কিনা।
উদাহরণ:
let regex = /(?<=a)b/;
let str = "ab";
console.log(regex.test(str)); // true
এখানে, "b" এর আগে "a" থাকা সত্ত্বেও প্যাটার্নটি true রিটার্ন করবে। তবে, "a" ছাড়া "b" থাকলে এটি মেলবে না।
Negative Lookbehind ((?<!...))
Negative Lookbehind প্যাটার্নটি চেক করবে যে পূর্ববর্তী অংশে কিছু নির্দিষ্ট শর্ত নেই কিনা।
সিনট্যাক্স:
let regex = /(?<!a)b/;
এখানে, (?<!a) চেক করবে যে "b" এর আগে "a" নেই।
উদাহরণ:
let regex = /(?<!a)b/;
let str = "cb";
console.log(regex.test(str)); // true
এখানে, "b" এর আগে "a" না থাকার কারণে, প্যাটার্নটি true রিটার্ন করবে। যদি "a" এর পরে "b" থাকে, তাহলে এটি মেলবে না।
Lookahead এবং Lookbehind এর ব্যবহার
- Lookahead ব্যবহার করে আপনি ভবিষ্যতের অংশ চেক করতে পারেন এবং তা অনুযায়ী শর্ত পূর্ণ হলে মিল পেতে পারেন। এটি positive এবং negative উভয় ধরনের হতে পারে।
- Lookbehind ব্যবহার করে আপনি স্ট্রিংয়ের পূর্ববর্তী অংশ চেক করতে পারেন। এটি স্ট্রিংয়ের আগের অংশের শর্ত অনুসারে মিল করতে সাহায্য করে।
সারাংশ
Lookaheads এবং Lookbehinds RegExp-এ ব্যবহার হয় ভবিষ্যত বা অতীতের শর্ত অনুযায়ী মিল নিশ্চিত করার জন্য।
- Positive Lookahead (
(?=...)): পরবর্তী অংশের শর্ত পূর্ণ হলে মিল হবে। - Negative Lookahead (
(?!...)): পরবর্তী অংশে নির্দিষ্ট শর্ত না থাকলে মিল হবে। - Positive Lookbehind (
(?<=...)): পূর্ববর্তী অংশের শর্ত পূর্ণ হলে মিল হবে। - Negative Lookbehind (
(?<!...)): পূর্ববর্তী অংশে নির্দিষ্ট শর্ত না থাকলে মিল হবে।
এগুলি assertions হিসেবে কাজ করে এবং স্ট্রিংয়ের অংশগুলোর সাথে মিল খুঁজে বের করতে খুবই কার্যকর।
RegExp-এ lookahead প্যাটার্নগুলি একটি গুরুত্বপূর্ণ ধারণা, যা বিশেষ ধরনের ম্যাচিং কন্ডিশন তৈরি করে। এগুলি zero-width assertions হিসাবে কাজ করে, অর্থাৎ এটি স্ট্রিংয়ের একটি নির্দিষ্ট অবস্থান চিহ্নিত করতে ব্যবহৃত হয়, তবে এটি সেই অবস্থানকে স্ট্রিংয়ে অন্তর্ভুক্ত করে না। এই প্যাটার্ন দুটি—positive lookahead এবং negative lookahead—স্ট্রিংয়ের ভিতরে এমন কিছু মিল খুঁজে বের করার জন্য ব্যবহৃত হয় যা নির্দিষ্ট শর্তে থাকবে।
Positive Lookahead (?=)
Positive Lookahead (?=) এমন একটি প্যাটার্ন, যা একটি নির্দিষ্ট শর্তের পরে কী আসবে তা পরীক্ষা করে। তবে এটি স্ট্রিংয়ের সেই অংশটিকে মেলানোর জন্য অন্তর্ভুক্ত করে না, এটি শুধু নিশ্চিত করে যে ওই অবস্থানে নির্দিষ্ট কিছু থাকবে।
Positive lookahead হল একটি শর্ত যা পরবর্তী অংশটি কি থাকবে তার জন্য পরীক্ষা করে।
উদাহরণ:
let regex = /[A-Za-z]+(?=\d)/;
let str = "Hello123";
console.log(regex.test(str)); // true
এখানে, [A-Za-z]+(?=\d) প্যাটার্নটি শুধুমাত্র এমন শব্দের জন্য মেলে, যার পরে একটি সংখ্যা রয়েছে। "Hello123" স্ট্রিংয়ের মধ্যে "Hello" এর পর একটি সংখ্যা আছে, তাই প্যাটার্নটি মেলে, কিন্তু "Hello" শব্দটিকে মেলানোর পর স্ট্রিংয়ে কোনো পরিবর্তন হবে না।
ব্যাখ্যা:
[A-Za-z]+: এটি এক বা একাধিক অক্ষর খুঁজে বের করে।(?=\d): এটি একটি positive lookahead যা নিশ্চিত করে যে, ঐ অক্ষরের পর একটি সংখ্যা (\d) থাকবে।
এখানে, "Hello" এর পরে একটি সংখ্যা (123) রয়েছে, তাই এটি মিলে যাচ্ছে, তবে সংখ্যা "123" মেলানো হচ্ছে না। শুধু "Hello" অংশটি মেলা হিসেবে চিহ্নিত হয়েছে।
Negative Lookahead (?!)
Negative Lookahead (?!) হল এমন একটি প্যাটার্ন, যা একটি নির্দিষ্ট শর্তের পরে কী আসবে না তা পরীক্ষা করে। এটি শর্তকে মেনে চলতে বাধা দেয়। অর্থাৎ, এটি একটি প্যাটার্ন মেলাতে হবে যদি পরবর্তী অংশটি কিছু নির্দিষ্ট শর্ত পূর্ণ না করে।
Negative lookahead হল একটি শর্ত যা পরবর্তী অংশটি কি থাকবে না, তা পরীক্ষা করে।
উদাহরণ:
let regex = /[A-Za-z]+(?!\d)/;
let str = "Hello123";
console.log(regex.test(str)); // false
এখানে, [A-Za-z]+(?!\d) প্যাটার্নটি মেলে যদি পরবর্তী অংশে কোনো সংখ্যা না থাকে। কিন্তু, "Hello123" স্ট্রিংয়ের মধ্যে "Hello" এর পরে সংখ্যা রয়েছে, তাই এটি মেলে না।
ব্যাখ্যা:
[A-Za-z]+: এটি এক বা একাধিক অক্ষর খুঁজে বের করে।(?!\d): এটি একটি negative lookahead যা নিশ্চিত করে যে, ঐ অক্ষরের পর একটি সংখ্যা না থাকবে।
এখানে, "Hello" এর পরে একটি সংখ্যা (123) রয়েছে, তাই এটি মেলে না। "Hello" এর পর যদি কোনো সংখ্যা না থাকত, তবে এটি মেলে যেত।
Positive এবং Negative Lookahead এর মধ্যে পার্থক্য
- Positive Lookahead (?=): এটি নিশ্চিত করে যে পরবর্তী অংশে কিছু নির্দিষ্ট থাকবে, তবে নিজে সেই অংশটিকে মেলানো হবে না।
- উদাহরণ:
/abc(?=\d)/- এটি "abc" কে মেলে যদি তার পরে একটি সংখ্যা থাকে।
- উদাহরণ:
- Negative Lookahead (?!): এটি নিশ্চিত করে যে পরবর্তী অংশে কিছু নির্দিষ্ট কিছু থাকবে না।
- উদাহরণ:
/abc(?!\d)/- এটি "abc" কে মেলে যদি তার পরে কোনো সংখ্যা না থাকে।
- উদাহরণ:
সারাংশ
Positive Lookahead (?=) এবং Negative Lookahead (?!) দুটি শক্তিশালী প্যাটার্ন যেগুলি নির্দিষ্ট শর্তে স্ট্রিংয়ের একটি অবস্থান চিহ্নিত করতে ব্যবহৃত হয়। Positive lookahead নিশ্চিত করে যে পরবর্তী অংশে কিছু নির্দিষ্ট থাকবে, আর negative lookahead নিশ্চিত করে যে পরবর্তী অংশে কিছু নির্দিষ্ট থাকবে না। এভাবে, lookahead প্যাটার্নগুলি স্ট্রিং ম্যানিপুলেশনে আরও নমনীয়তা এবং জটিলতা যোগ করে।
Lookbehind RegExp এর একটি শক্তিশালী ফিচার, যা স্ট্রিংয়ের পূর্বের অংশ (preceding text) চেক করে এবং তার ভিত্তিতে প্যাটার্ন মিলায়। এটি বিশেষভাবে দরকারী যখন আপনি কোনো নির্দিষ্ট অংশের আগে বা পরে কিছু অনুসন্ধান করতে চান, তবে সেই অংশকে মিলাতে চান না। Lookbehind দুটি ধরনে আসে: Positive Lookbehind এবং Negative Lookbehind।
Positive Lookbehind (?<=)
Positive Lookbehind প্যাটার্নটি চেক করে যে, আপনার উল্লেখিত প্যাটার্নটি ঠিক নির্দিষ্ট অংশের আগে আছে কিনা, এবং যদি থাকে তবে প্যাটার্নটি মেলে। এটি স্ট্রিংয়ের পূর্বের অংশে কিছু নির্দিষ্ট শর্ত অনুসারে মিল খুঁজে বের করার জন্য ব্যবহৃত হয়।
Positive Lookbehind কখনোই ম্যাচ না করে শুধু "পরে যা আছে" সেটি পরীক্ষা করে। প্যাটার্নে (?<=...) ব্যবহার করা হয়।
উদাহরণ:
let regex = /(?<=@)\w+/;
let str = "hello@example.com";
console.log(str.match(regex)); // ["example"]
এখানে, (?<=@) প্যাটার্নটি চেক করছে যে, স্ট্রিংয়ে @ এর পরে কোন শব্দ (word character) রয়েছে কি না। ফলস্বরূপ, এটি @ চিহ্নের পরে থাকা "example" অংশটি মেলে।
ব্যবহার:
Positive Lookbehind এর মাধ্যমে আপনি নির্দিষ্ট কোনো চরিত্রের পরে যা কিছু রয়েছে তা মেলাতে পারেন, তবে পূর্ববর্তী অংশকে মিলাতে পারবেন না।
উদাহরণ:
let regex = /(?<=\d{3}-)\d+/;
let str = "My phone number is 123-4567";
console.log(str.match(regex)); // ["4567"]
এখানে, (?<=\d{3}-) প্যাটার্নটি চেক করছে যে, তিনটি সংখ্যা এবং একটি - এর পরে কিছু সংখ্যা আছে কিনা। এবং পরে থাকা সংখ্যা 4567 মেলানো হচ্ছে।
Negative Lookbehind (?<!)
Negative Lookbehind প্যাটার্নটি চেক করে যে, আপনার উল্লেখিত প্যাটার্নটি নির্দিষ্ট অংশের আগে নেই। অর্থাৎ, এটি স্ট্রিংয়ের পূর্বের অংশে কিছু না থাকার শর্তে মিল খুঁজে বের করে।
Negative Lookbehind কখনোই ম্যাচ না করে শুধু "পরে যা নেই" সেটি পরীক্ষা করে। প্যাটার্নে (?<!) ব্যবহার করা হয়।
উদাহরণ:
let regex = /(?<!@)\w+/;
let str = "hello@example.com";
console.log(str.match(regex)); // ["hello"]
এখানে, (?<!@) প্যাটার্নটি চেক করছে যে, @ চিহ্নের আগে কোনো শব্দ নেই। ফলস্বরূপ, এটি "hello" অংশটি মেলে, কারণ @ চিহ্নের আগে এটি রয়েছে না।
ব্যবহার:
Negative Lookbehind এর মাধ্যমে আপনি এমন একটি শর্ত পরীক্ষা করতে পারেন যেখানে কিছু নির্দিষ্ট অংশের আগে কিছু না থাকার শর্তে মিল খুঁজতে চান।
উদাহরণ:
let regex = /(?<!\d)-?\d+/;
let str = "My total is -500 and cost is 300";
console.log(str.match(regex)); // ["-500"]
এখানে, (?<!\d) প্যাটার্নটি চেক করছে যে, কোনো সংখ্যা আগে নেই। যদি -500 এর আগে কোনো সংখ্যা না থাকে, তবে এটি মেলানো হবে। "300" মেলানো হবে না, কারণ সেখানে একটি সংখ্যা (3) পূর্বে আছে।
Positive Lookbehind এবং Negative Lookbehind এর পার্থক্য
- Positive Lookbehind: এটি চেক করে যে, কিছু নির্দিষ্ট প্যাটার্নের পরে অন্য কিছু আছে কিনা।
- Negative Lookbehind: এটি চেক করে যে, কিছু নির্দিষ্ট প্যাটার্নের আগে কিছু নেই।
সারাংশ
Positive Lookbehind (?<=) এবং Negative Lookbehind (?<!) RegExp-এর শক্তিশালী টুলস যা স্ট্রিংয়ের পূর্বের অংশের শর্তে মিল খুঁজে বের করতে সহায়তা করে।
- Positive Lookbehind একটি নির্দিষ্ট প্যাটার্নের পরে কী আছে তা পরীক্ষা করে।
- Negative Lookbehind একটি নির্দিষ্ট প্যাটার্নের আগে কী নেই তা পরীক্ষা করে।
এই দুটি মেটাচরিত্র ব্যবহার করে, আপনি স্ট্রিং ম্যানিপুলেশনে আরো সূক্ষ্ম নিয়ন্ত্রণ পেতে পারেন।
RegExp-এ Lookahead এবং Lookbehind এমন বিশেষ প্যাটার্ন চেকিং কৌশল, যা একটি স্ট্রিংয়ের নির্দিষ্ট অবস্থান থেকে আগে বা পরে থাকা তথ্যের উপর ভিত্তি করে মিল খুঁজে পেতে ব্যবহৃত হয়। এই কৌশলগুলির মাধ্যমে আপনি স্ট্রিংয়ের কোনো নির্দিষ্ট অংশকে প্রত্যক্ষভাবে মেলে না (অর্থাৎ মেলা হওয়া অংশ স্ট্রিংয়ের অংশ হিসেবে অন্তর্ভুক্ত হয় না), কিন্তু শুধুমাত্র প্যাটার্নের উপস্থিতি যাচাই করতে পারেন।
Lookahead (এগিয়ে চেক করা)
Lookahead একটি প্যাটার্নের এমন অংশ যেটি স্ট্রিংয়ের নির্দিষ্ট স্থানে অবস্থান করে থাকলেও, মেলা হওয়া অংশ স্ট্রিংয়ের ফলস্বরূপ অংশ হিসেবে অন্তর্ভুক্ত হয় না। এটি অফসেট চেকিং পদ্ধতি হিসেবে কাজ করে, যেখানে আপনি জানাতে পারেন যে প্যাটার্নটি একটি নির্দিষ্ট অবস্থানে থাকতে হবে, কিন্তু সে অংশটি মেলা হওয়া স্ট্রিংয়ের অংশ হিসেবে গণ্য হবে না।
Syntax:
/pattern(?=condition)/
এখানে, (?=condition) হল positive lookahead যা মেলে যদি এবং শুধু যদি পরবর্তী অংশের মধ্যে condition থাকে।
উদাহরণ: Positive Lookahead
let regex = /\d(?=\D)/;
let str = "123a";
console.log(regex.test(str)); // true
এখানে, \d(?=\D) প্যাটার্নটি একটি সংখ্যা \d চেক করছে, এবং নিশ্চিত হচ্ছে যে তার পরে একটি অসংখ্য অক্ষর (non-digit) আছে (?=\D)। এটি "123a" স্ট্রিংয়ের মধ্যে প্রথম সংখ্যা 1 এর পরে "a" পায়, যা একটি non-digit অক্ষর।
Negative Lookahead (আগে কিছু না থাকা)
Negative Lookahead হল এমন একটি প্যাটার্ন যেখানে আপনি নিশ্চিত করতে চান যে কোনো নির্দিষ্ট প্যাটার্ন একটি স্থানে অবস্থান না করে। এই কৌশলটি negative মিল খুঁজে পেতে ব্যবহৃত হয়, অর্থাৎ প্যাটার্নটি মিলবে না যদি পরবর্তী অংশে কোনো নির্দিষ্ট শর্ত থাকে।
Syntax:
/pattern(?!condition)/
এখানে, (?!condition) হল negative lookahead যা মেলে যদি পরবর্তী অংশে condition না থাকে।
উদাহরণ: Negative Lookahead
let regex = /\d(?!\D)/;
let str = "1234";
console.log(regex.test(str)); // true
এখানে, \d(?!\D) প্যাটার্নটি একটি সংখ্যা \d চেক করছে এবং নিশ্চিত করছে যে তার পরে কোনো অসংখ্য অক্ষর (non-digit) নেই। এটি "1234" স্ট্রিংয়ের মধ্যে প্রথম সংখ্যা 1 এর পরে আর কোনো non-digit অক্ষর না পাওয়ায় মিলবে।
Lookbehind (পিছনে চেক করা)
Lookbehind একটি প্যাটার্নের অংশ যেখানে আপনি স্ট্রিংয়ের নির্দিষ্ট স্থানে থাকা অংশের আগের দিকে পরীক্ষা করতে পারেন, কিন্তু সেই অংশটি মেলা হওয়া স্ট্রিংয়ের অংশ হিসেবে গণ্য হবে না। অর্থাৎ, আপনি যদি জানতে চান যে প্যাটার্নটি কোনো নির্দিষ্ট অংশের পরে উপস্থিত আছে, তাহলে আপনি lookbehind ব্যবহার করতে পারেন।
Syntax:
/(?<=condition)pattern/
এখানে, (?<=condition) হল positive lookbehind যা মেলে যদি condition প্যাটার্নের আগে কোনো নির্দিষ্ট শর্ত থাকে।
উদাহরণ: Positive Lookbehind
let regex = /(?<=@)\w+/;
let str = "email@example.com";
console.log(regex.test(str)); // true
এখানে, (?<=@)\w+ প্যাটার্নটি চেক করছে যে একটি শব্দ \w+ ঠিক @ চিহ্নের পরে এসেছে। "email@example.com" স্ট্রিংয়ের মধ্যে @ এর পরে "example" পাওয়া যাচ্ছে, যা মেলে।
Negative Lookbehind (পিছনে কিছু না থাকা)
Negative Lookbehind হল এমন একটি প্যাটার্ন যেখানে আপনি নিশ্চিত করতে চান যে কোনো নির্দিষ্ট প্যাটার্ন একটি স্থানে পূর্ববর্তী অংশে উপস্থিত নয়।
Syntax:
/(?<!condition)pattern/
এখানে, (?<!condition) হল negative lookbehind যা মেলে যদি condition প্যাটার্নটি পূর্ববর্তী অংশে না থাকে।
উদাহরণ: Negative Lookbehind
let regex = /(?<!@)\w+/;
let str = "user123";
console.log(regex.test(str)); // true
এখানে, (?<!@)\w+ প্যাটার্নটি চেক করছে যে একটি শব্দ \w+ পূর্বে @ না থাকলে মেলে। "user123" স্ট্রিংয়ের মধ্যে "user123" এর পূর্বে কোনো @ চিহ্ন নেই, তাই এটি মেলে।
সারাংশ
Lookaheads এবং Lookbehinds হল RegExp-এ বিশেষ ধরনের প্যাটার্ন মেলানোর কৌশল।
- Lookahead প্যাটার্নটি স্ট্রিংয়ের আগের অংশে মেলানোর চেষ্টা করে, কিন্তু সেই অংশটি স্ট্রিংয়ের অংশ হিসেবে অন্তর্ভুক্ত হয় না।
- Positive lookahead: পরবর্তী অংশের শর্ত পূর্ণ হলে মেলে।
- Negative lookahead: পরবর্তী অংশে শর্ত না থাকলে মেলে।
- Lookbehind প্যাটার্নটি স্ট্রিংয়ের পূর্ববর্তী অংশে মেলানোর চেষ্টা করে, কিন্তু সেই অংশটি স্ট্রিংয়ের অংশ হিসেবে অন্তর্ভুক্ত হয় না।
- Positive lookbehind: পূর্ববর্তী অংশে শর্ত পূর্ণ হলে মেলে।
- Negative lookbehind: পূর্ববর্তী অংশে শর্ত না থাকলে মেলে।
এগুলি সাধারণত স্ট্রিংয়ের নির্দিষ্ট অবস্থান বা শর্ত যাচাই করতে ব্যবহৃত হয়, যেখানে মিল পাওয়ার পরে মেলা অংশগুলো অন্তর্ভুক্ত করা হয় না।
Read more